package redecolaborativa.client;

import java.util.List;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.CaptionPanel;

public class CadastroItem extends Composite {
	private final FachadaAsync fachada;
	private String login;
	private AbsolutePanel absolutePanel = new AbsolutePanel();;
	AbsolutePanel absolutePanelCaption = new AbsolutePanel();

	public CadastroItem(final FachadaAsync fachada, final String login) {
		this.fachada = fachada;
		this.login = login;
		initWidget(absolutePanel);
		absolutePanel.setSize("486px", "451px");
		inicializaLabels();
		
		CaptionPanel cptnpnlNewPanel = new CaptionPanel("Cadastro de um novo item");
		cptnpnlNewPanel.setStyleName("caption-panel");
		absolutePanel.add(cptnpnlNewPanel, 48, 10);
		cptnpnlNewPanel.setSize("402px", "424px");
		
		cptnpnlNewPanel.setContentWidget(absolutePanelCaption);
		absolutePanelCaption.setSize("403px", "404px");
		
		final TextBox nome = new TextBox();
		absolutePanelCaption.add(nome, 82, 10);
		nome.setSize("272px", "16px");
		
		final TextBox categoria = new TextBox();
		absolutePanelCaption.add(categoria, 114, 53);
		categoria.setSize("240px", "16px");
		
		final TextArea descricao = new TextArea();
		absolutePanelCaption.add(descricao, 110, 239);
		descricao.setSize("240px", "99px");
		
		cadastrarItem(nome, categoria, descricao);
		
	}

	@SuppressWarnings("deprecation")
	private void cadastrarItem(final TextBox nome, final TextBox categoria, final TextArea descricao) {
		final ListBox listBox = new ListBox();
		absolutePanelCaption.add(listBox, 114, 98);
		listBox.setSize("250px", "94px");
		listBox.setVisibleItemCount(5);
		listBox.setMultipleSelect(true);
		
		atualizaListaCategorias(listBox);
		
		Button btnCadastrar = new Button("Cadastrar");
		absolutePanelCaption.add(btnCadastrar, 158, 365);
		btnCadastrar.setSize("147px", "29px");
		btnCadastrar.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				try {
					fachada.cadastrarItem(login, nome.getText(), constroiCategorias(listBox, categoria), descricao.getText(), new AsyncCallback<Void>() {
						@Override
						public void onSuccess(Void result) {
							atualizaListaCategorias(listBox);
							limparCampos(nome, categoria, descricao);
							Window.alert("Item cadastrado com sucesso!");
						}
						@Override
						public void onFailure(Throwable caught) {
							atualizaListaCategorias(listBox);
							limparCampos(nome, categoria, descricao);
							Window.alert("Item cadastrado com sucesso!");
						}
					});
				} catch (Exception e) {
					Window.alert(e.getMessage());
				}
			}
		});
	}

	private String constroiCategorias(ListBox listBox, TextBox categoria) {
		String categorias = "";
		for (int i = 0; i < listBox.getItemCount(); i++) {
			if (listBox.isItemSelected(i)) {
				categorias += (listBox.getItemText(i) + " ");
			}
		} 
		categorias += categoria.getText();
		return categorias;
	}

	private void atualizaListaCategorias(final ListBox listBox) {
		listBox.clear();
		fachada.getCategorias(new AsyncCallback<List<String>>() {
			@Override
			public void onFailure(Throwable caught) {}
			@Override
			public void onSuccess(List<String> result) {
				for (String categoria: result) {
					listBox.addItem(categoria);
				}
			}
		});
	}

	private void inicializaLabels() {
		Label lblNome = new Label("Nome: ");
		absolutePanelCaption.add(lblNome, 31, 19);
		Label lblCategoria = new Label("Categoria: ");
		absolutePanelCaption.add(lblCategoria, 31, 62);
		Label lblLliaVaiFazer = new Label("Escolha alguma(s) das categorias listadas, ou crie uma(s) de sua prefer\u00EAncia (escreva os nomes das categorias separados por espa\u00E7os).");
		lblLliaVaiFazer.setStyleName("label-pequeno");
		absolutePanelCaption.add(lblLliaVaiFazer, 20, 198);
		lblLliaVaiFazer.setSize("368px", "39px");
		Label lblDescrio = new Label("Descri\u00E7\u00E3o: ");
		absolutePanelCaption.add(lblDescrio, 29, 254);
	}
	
	private void limparCampos(TextBox nome, TextBox categoria, TextArea descricao) {
		nome.setText("");
		categoria.setText("");
		descricao.setText("");
	}
}